/**
 * Hero项目身份验证API
 * 
 * 提供登录、注册、获取用户信息、注销等功能
 * 支持token自动管理和登录状态过期检测
 * 
 * 使用方式：
 * ```html
 * <script src="js/auth.js"></script>
 * <script>
 *     // 登录
 *     HeroAuth.login('admin', 'admin123')
 *         .then(data => console.log('登录成功:', data))
 *         .catch(error => console.error('登录失败:', error));
 * 
 *     // 获取用户信息
 *     HeroAuth.getInfo()
 *         .then(data => console.log('用户信息:', data))
 *         .catch(error => console.error('获取失败:', error));
 * 
 *     // 注销
 *     HeroAuth.logout()
 *         .then(() => console.log('注销成功'))
 *         .catch(error => console.error('注销失败:', error));
 * </script>
 * ```
 */

(function() {
    // API基础配置
    const API_BASE_URL = '/dev-api';
    const TOKEN_KEY = 'hero_token';
    
    // Token管理
    const TokenManager = {
        // 获取token
        get() {
            return localStorage.getItem(TOKEN_KEY);
        },
        
        // 设置token
        set(token) {
            localStorage.setItem(TOKEN_KEY, token);
        },
        
        // 移除token
        remove() {
            localStorage.removeItem(TOKEN_KEY);
        },
        
        // 检查是否有token
        has() {
            return !!this.get();
        }
    };
    
    // HTTP请求工具
    function request(config) {
        const url = API_BASE_URL + config.url;
        const options = {
            method: config.method || 'GET',
            headers: {
                'Content-Type': 'application/json',
                ...config.headers
            }
        };
        
        // 添加认证头
        const token = TokenManager.get();
        if (token && !config.skipAuth) {
            options.headers['Authorization'] = 'Bearer ' + token;
        }
        
        // 处理请求体
        if (config.data) {
            options.body = JSON.stringify(config.data);
        }
        
        // 处理GET请求参数
        if (config.params && config.method === 'GET') {
            const searchParams = new URLSearchParams(config.params);
            const separator = config.url.includes('?') ? '&' : '?';
            url += separator + searchParams.toString();
        }
        
        return fetch(url, options)
            .then(response => {
                // 检查HTTP状态
                if (!response.ok) {
                    throw new Error(`HTTP ${response.status}: ${response.statusText}`);
                }
                return response.json();
            })
            .then(data => {
                // 检查业务状态码
                const code = data.code || 200;
                
                if (code === 401) {
                    // 登录状态过期
                    TokenManager.remove();
                    if (window.HeroLoginModal) {
                        window.HeroLoginModal.showExpiredModal();
                    }
                    throw new Error('登录状态已过期，请重新登录');
                } else if (code === 500) {
                    throw new Error(data.msg || '服务器内部错误');
                } else if (code === 601) {
                    throw new Error(data.msg || '请求参数错误');
                } else if (code !== 200) {
                    throw new Error(data.msg || '请求失败');
                }
                
                return data;
            })
            .catch(error => {
                console.error('Request failed:', error);
                throw error;
            });
    }
    
    // 身份验证API
    const HeroAuth = {
        /**
         * 用户登录
         * @param {string} username 用户名
         * @param {string} password 密码
         * @returns {Promise} 登录结果
         */
        login(username, password) {
            return request({
                url: '/login',
                method: 'POST',
                skipAuth: true,
                data: {
                    username: username,
                    password: password
                }
            }).then(data => {
                // 保存token
                if (data.token) {
                    TokenManager.set(data.token);
                }
                return data;
            });
        },
        
        /**
         * 用户注册
         * @param {Object} userData 注册数据
         * @returns {Promise} 注册结果
         */
        register(userData) {
            return request({
                url: '/register',
                method: 'POST',
                skipAuth: true,
                data: userData
            });
        },
        
        /**
         * 获取用户信息
         * @returns {Promise} 用户信息
         */
        getInfo() {
            return request({
                url: '/getInfo',
                method: 'GET'
            });
        },
        
        /**
         * 用户注销
         * @returns {Promise} 注销结果
         */
        logout() {
            return request({
                url: '/logout',
                method: 'POST'
            }).then(data => {
                // 清除token
                TokenManager.remove();
                return data;
            }).catch(error => {
                // 即使请求失败也要清除本地token
                TokenManager.remove();
                throw error;
            });
        },
        
        /**
         * 检查登录状态
         * @returns {boolean} 是否已登录
         */
        isLoggedIn() {
            return TokenManager.has();
        },
        
        /**
         * 获取当前token
         * @returns {string|null} token
         */
        getToken() {
            return TokenManager.get();
        },
        
        /**
         * 清除登录状态
         */
        clearAuth() {
            TokenManager.remove();
        },
        
        /**
         * 设置登录状态过期回调
         * @param {Function} callback 回调函数
         */
        onAuthExpired(callback) {
            this._authExpiredCallback = callback;
        },
        
        /**
         * 验证token有效性
         * @returns {Promise} 验证结果
         */
        validateToken() {
            if (!this.isLoggedIn()) {
                return Promise.reject(new Error('未登录'));
            }
            
            return this.getInfo().catch(error => {
                if (error.message.includes('过期')) {
                    this.clearAuth();
                }
                throw error;
            });
        }
    };
    
    // 全局暴露
    window.HeroAuth = HeroAuth;
    
    // 页面加载时检查登录状态
    document.addEventListener('DOMContentLoaded', function() {
        if (HeroAuth.isLoggedIn()) {
            // 验证token有效性
            HeroAuth.validateToken().catch(error => {
                console.warn('Token验证失败:', error.message);
            });
        }
    });
    
})();